import datetime
import tkinter as tk  # 图形界面库


def create_gui():
    """创建图形用户界面组件"""
    # 初始化主窗口
    root = tk.Tk()
    root.title("中考倒计时")
    root.geometry("400x500")  # 设置窗口尺寸

    # 创建主容器框架
    main_frame = tk.Frame(root, bg="#f0f0f0")  # 设置背景颜色
    main_frame.pack(pady=20, fill='both', expand=True)  # 填充布局

    # 创建倒计时标签（使用微软雅黑字体）
    time_label = tk.Label(main_frame,
                          font=('Microsoft YaHei', 18, 'bold'),  # 字体设置
                          foreground='#2c3e50',  # 文字颜色
                          bg="#f0f0f0")  # 背景颜色
    time_label.pack(pady=10)  # 垂直间距

    # 创建温度计画布
    canvas = tk.Canvas(main_frame, width=100, height=300, bg="#f0f0f0", highlightthickness=0)
    canvas.pack(pady=10)

    return root, time_label, canvas  # 返回界面组件


def draw_thermometer(canvas, percentage):
    """绘制温度计效果的进度条
    参数：
        canvas: 画布对象
        percentage: 进度百分比（0-100）
    """
    # 清除画布
    canvas.delete("thermometer")

    # 绘制温度计外框
    canvas.create_rectangle(30, 40, 70, 280, outline="#34495e", width=2, tag="thermometer")

    # 绘制温度计顶部小圆圈
    canvas.create_oval(20, 30, 80, 50, outline="#34495e", width=2, fill="#ecf0f1", tag="thermometer")

    # 计算水银柱高度
    mercury_height = 240 * (percentage / 100)

    # 定义颜色渐变（每10%变化一次颜色，底部颜色更深）
    if percentage >= 90:
        mercury_color = "#ffcccc"  # 浅红色
    elif percentage >= 80:
        mercury_color = "#ffb3b3"  # 淡红色
    elif percentage >= 70:
        mercury_color = "#ff9999"  # 粉色
    elif percentage >= 60:
        mercury_color = "#ff6666"  # 红色
    elif percentage >= 50:
        mercury_color = "#ff3333"  # 深红色
    elif percentage >= 40:
        mercury_color = "#ff0000"  # 纯红色
    elif percentage >= 30:
        mercury_color = "#cc0000"  # 暗红色
    elif percentage >= 20:
        mercury_color = "#990000"  # 深暗红色
    elif percentage >= 10:
        mercury_color = "#660000"  # 黑红色
    else:
        mercury_color = "#330000"  # 深黑红色

    canvas.create_rectangle(35, 280 - mercury_height, 65, 280,
                            fill=mercury_color, outline="", tag="thermometer")

    # 绘制刻度线和数字
    for i in range(0, 101, 10):
        y = 280 - (i * 2.4)
        canvas.create_line(25, y, 30, y, fill="#34495e", tag="thermometer")
        canvas.create_text(85, y, text=str(i) + "%", font=('Microsoft YaHei', 8),
                           fill="#34495e", tag="thermometer")

    # 显示当前百分比
    canvas.create_text(50, 350, text=f"{percentage:.1f}%", font=('Microsoft YaHei', 12, 'bold'),
                       fill="#34495e", tag="thermometer")


def update_display(root, label, canvas, exam_date, start_date):
    """更新界面显示
    参数：
        root: 主窗口对象
        label: 时间标签
        canvas: 画布对象
        exam_date: 中考日期
        start_date: 开始时间（每次启动程序时的当前时间）
    """
    now = datetime.datetime.now()  # 获取当前时间
    delta = exam_date - now  # 计算时间差

    # 判断是否已到中考时间
    if now >= exam_date:
        label.config(text="考试结束！祝你金榜题名！", foreground='#27ae60')  # 绿色完成提示
        draw_thermometer(canvas, 100)  # 绘制满温度计
        root.update()  # 强制刷新界面
        return

    # 计算剩余时间（精确到秒）
    total_seconds = delta.total_seconds()
    days = delta.days  # 剩余天数
    hours = delta.seconds // 3600  # 计算剩余天数之外的小时数
    minutes, seconds = divmod(delta.seconds % 3600, 60)  # 剩余分钟和秒

    # 更新时间显示文字
    time_text = f"距离中考还有：{days}天 {hours:02d}:{minutes:02d}:{seconds:02d}"
    label.config(text=time_text)

    # 计算进度百分比（基于开始时间和中考时间）
    total_duration = (exam_date - start_date).total_seconds()
    if total_duration > 0:  # 避免除以零
        progress_percent = (1 - total_seconds / total_duration) * 100  # 已用时间百分比
        draw_thermometer(canvas, progress_percent)  # 绘制温度计

    # 设置1秒后再次更新（实现实时刷新）
    root.after(1000, update_display, root, label, canvas, exam_date, start_date)


def exam_countdown():
    """启动倒计时主程序"""
    exam_date = datetime.datetime(2025, 6, 24, 0, 0)  # 设置中考日期（示例：2025年6月24日上午9点）
    # start_date = datetime.datetime(2025, 4, 25, 0, 0)  # 测试从4月25日开始
    start_date = datetime.datetime.now()
    root, label, canvas = create_gui()  # 创建界面
    update_display(root, label, canvas, exam_date, start_date)  # 启动更新循环
    root.mainloop()  # 进入GUI事件循环


if __name__ == "__main__":
    # 程序入口
    print("中考倒计时演示（关闭窗口退出）")
    exam_countdown()  # 启动主程序